package br.com.cogerh.sidec.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import br.com.cogerh.sidec.model.Compromisso;
import br.com.cogerh.sidec.model.Projeto;
import br.com.cogerh.sidec.util.HibernateUtil;

public class CompromissoImpl implements CompromissoDAO {

	@Override
	public void salvar(Compromisso compromisso) {
		Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
		Compromisso comp = new Compromisso();
		comp.setConcluidoMeta(compromisso.isConcluidoMeta());
		comp.setCoresStatus(compromisso.getCoresStatus());
		comp.setDescricao(compromisso.getDescricao());
		comp.setEmailEnviadoDiretor(compromisso.isEmailEnviadoDiretor());
		comp.setEmailEviadoPresidente(compromisso.isEmailEviadoPresidente());
		comp.setId(compromisso.getId());
		comp.setMetaConclusao(compromisso.getMetaConclusao());
		comp.setNumeroCompromisso(compromisso.getNumeroCompromisso());
		comp.setPessoa(compromisso.getPessoa());
		comp.setRecusado(compromisso.getRecusado());
		comp.setReuniao(compromisso.getReuniao());
		comp.setSolicitante(compromisso.getSolicitante());
		comp.setStatus(compromisso.getStatus());
		comp.setValidacao(compromisso.isValidacao());

		if (compromisso.getProjeto().getId().equals(0)) {
			comp.setProjeto(null);
		} else {
			comp.setProjeto(compromisso.getProjeto());
		}
		Transaction tx = sessao.beginTransaction();

		try {
			sessao.save(comp);
			sessao.flush();
			sessao.close();
			tx.commit();
		} catch (HibernateException e) {
			tx.rollback();
		}

	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Compromisso> listar() {
		Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction tx  = sessao.beginTransaction();
		List<Compromisso> lista = new ArrayList<Compromisso>();

		try{
			
		
		Criteria criteria = sessao.createCriteria(Compromisso.class);
		criteria.addOrder(Order.asc("numeroCompromisso"));

		criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

		lista = criteria.list();

		sessao.close();
		}catch(HibernateException e){
			tx.rollback();
		}
		return lista;
	}

	@Override
	public void editar(Compromisso compromisso) {
		Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();

		Compromisso comp = new Compromisso();
		comp.setConcluidoMeta(compromisso.isConcluidoMeta());
		comp.setCoresStatus(compromisso.getCoresStatus());
		comp.setDescricao(compromisso.getDescricao());
		comp.setEmailEnviadoDiretor(compromisso.isEmailEnviadoDiretor());
		comp.setEmailEviadoPresidente(compromisso.isEmailEviadoPresidente());
		comp.setId(compromisso.getId());
		comp.setMetaConclusao(compromisso.getMetaConclusao());
		comp.setNumeroCompromisso(compromisso.getNumeroCompromisso());
		comp.setPessoa(compromisso.getPessoa());
		comp.setRecusado(compromisso.getRecusado());
		comp.setReuniao(compromisso.getReuniao());
		comp.setSolicitante(compromisso.getSolicitante());
		comp.setStatus(compromisso.getStatus());
		comp.setValidacao(compromisso.isValidacao());

		Projeto projeto = null;

		projeto = compromisso.getProjeto();

		if (projeto == null) {
			System.out.println("nulo");
			comp.setProjeto(null);
		}

		if (projeto != null) {
			if (compromisso.getProjeto().getId().equals(0)) {
				comp.setProjeto(null);
			} else {
				comp.setProjeto(compromisso.getProjeto());
			}
		}
		Transaction tx = sessao.beginTransaction();
		try {
			sessao.merge(comp);
			sessao.flush();
			sessao.close();
			tx.commit();
		} catch (HibernateException e) {
			tx.rollback();
		}

	}

	@Override
	public void excluir(Compromisso compromisso) {
		Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();

		Transaction tx = sessao.beginTransaction();
		try {
			sessao.delete(compromisso);
			sessao.flush();
			sessao.close();
			tx.commit();
		} catch (HibernateException e) {
			tx.rollback();
		}

	}

	@Override
	public void salvarListaa(List<Compromisso> compromissos) {
		// compromisso.getProjeto().setId(425);
		Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();

		Transaction tx = sessao.beginTransaction();

		for (Compromisso compromisso : compromissos) {
			compromisso.getProjeto().setId(1693);

			sessao.save(compromisso);
		}
		try {
			sessao.flush();
			sessao.close();
			tx.commit();
		} catch (HibernateException e) {
			tx.rollback();
		}

	}

	@Override
	public void editarLista(List<Compromisso> compromissos) {
		Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();

		Transaction tx = sessao.beginTransaction();

		for (Compromisso compromisso : compromissos) {
			sessao.merge(compromisso);

		}
		try {
			sessao.flush();
			sessao.close();
			tx.commit();
		} catch (HibernateException e) {
			tx.rollback();
		}

	}

	@Override
	public void salvarCompromissosPlanilha(Compromisso compromisso) {
		Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();

		Transaction tx = sessao.beginTransaction();
		try {
			sessao.save(compromisso);
			sessao.flush();
			sessao.close();
			tx.commit();
		} catch (HibernateException e) {
			tx.rollback();
		}

	}

	@Override
	public void editarValidacao(Compromisso compromisso) {
		Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction tx = sessao.beginTransaction();

		try {
			compromisso.setValidacao(true);
			sessao.merge(compromisso);
			sessao.flush();
			sessao.close();
			tx.commit();
		} catch (HibernateException e) {
			tx.rollback();
		}

	}

	@Override
	public void fecharSessao() {

	}

	@Override
	public List<Compromisso> listarByPessoa(Integer id) {
		Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction tx = sessao.beginTransaction();
		List<Compromisso> lista = new ArrayList<Compromisso>();
		try{
			Criteria criteria = sessao.createCriteria(Compromisso.class);
			criteria.addOrder(Order.asc("numeroCompromisso"));
			criteria.add(Restrictions.eq("pessoa.id", id));
			criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
			lista = criteria.list();
			sessao.close();
		}catch(HibernateException e){
			tx.rollback();
		}
	
		return lista;

	}

	@Override
	public List<Compromisso> listarCompromissosAtrasados() {
		Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction tx = sessao.beginTransaction();
		List<Compromisso> lista = new ArrayList<Compromisso>();
		try{
			Criteria criteria = sessao.createCriteria(Compromisso.class);
			criteria.addOrder(Order.asc("numeroCompromisso"));
			criteria.add(Restrictions.eq("status", "Atrasado"));
			criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
			lista = criteria.list();
			sessao.close();
		}catch(HibernateException e){
			tx.rollback();
		}
	
		return lista;	}

	@Override
	public void editarJob(Compromisso compromisso) {
		Session sessao = HibernateUtil.getSessionFactory().getCurrentSession();

		Transaction tx = sessao.beginTransaction();
		try {
			sessao.merge(compromisso);
			sessao.flush();
			sessao.close();
			tx.commit();
		} catch (HibernateException e) {
			tx.rollback();
		}

		
	}

}
